#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;


// 如果我们不想等待子进程，并且我们还想让子进程退出之后，自动释放僵尸子进程
// int main()
// {
//     signal(SIGCHLD,SIG_IGN);// 手动设置对子进程进行忽略,这样fork出来的子进程在终止时会自动清理掉，不会产生僵尸进程
//     if(fork()==0)
//     {
//         //child
//         cout<<"I am child: "<<getpid()<<endl;
//         sleep(5);
//         exit(1);
//     }

//     while(true)
//     {
//         cout << "parent: " << getpid() << " 执行我自己的任务!" << endl;
//         sleep(1);
//     }

//     return 0;
// }





///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



// volatile int flag=0;//关键字volatile的作用：保持了内存的可见性

// void handler(int signum)
// {
//     cout<<"flag change:"<<flag;
//     flag=1;
//     cout<<"->"<<flag<<endl;
// }

// int main()
// {
//     signal(2,handler);
//     while(!flag);
//     cout << "进程正常退出后：" << flag << endl;
//     return 0;
// }


////////////////////////////////////////////////////////////////////////////////////////////////////////////



// void showPending(sigset_t *pending)
// {
//     for (int sig = 31; sig >= 1; sig--)
//     {
//         if (sigismember(pending, sig))
//             cout << "1";
//         else
//             cout << "0";
//     }
//     cout << endl;
// }

// void handler(int signum)
// {
//     cout << "获取一个信号：" << signum << endl;
//     cout << "获取一个信号：" << signum << endl;
//     cout << "获取一个信号：" << signum << endl;
//     cout << "获取一个信号：" << signum << endl;
//     cout << "获取一个信号：" << signum << endl;

//     sigset_t pending;
//     int count = 0;
//     while (true)
//     {
//         sigpending(&pending);
//         showPending(&pending);
//         count++;
//         if (count == 10)
//             break;
//         sleep(1);
//     }
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);//初始化mask值
//     act.sa_handler = handler;//定义回调函数

//     //调用信号处理函数时，除了当前信号被自动屏蔽之外，还可以自动屏蔽另外一些信号，
//     //加入进程的信号屏蔽字，当信号处理函数返回时自动恢复原来的信号屏蔽字，
//     //这样就保证了在处理某个信号时，如果这种信号再次产生，那么它会被阻塞到当前处理结束为止
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     sigaddset(&act.sa_mask, 5);

//     // 设置进当前调用进程的pcb中
//     sigaction(2, &act, &oact);

//     while (true)
//         sleep(1);

//     return 0;
// }